/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.controller;

import br.com.folha.dao.GenericoDao;
import br.com.folha.dao.UnidadeDao;
import br.com.folha.dao.UsuarioDao;
import br.com.folha.entity.Unidade;
import br.com.folha.entity.Usuario;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 *
 * @author marceloml
 */
@ManagedBean(name="UnidadeController")
@ViewScoped
public class UnidadeController implements Serializable{
    
    private static final long serialVersionUID = 1L;
    private Unidade unidade;
    private transient DataModel lista;
    private GenericoDao unidadeDao = new GenericoDao();
    private UsuarioDao usuarioDao = new UsuarioDao();
    private UnidadeDao consulta = new UnidadeDao();
    private Long resultado;
    private boolean retorno;
    private Unidade unidadeSelecionada;
    private String acao;
    private Date data = new Date();
    private List<Usuario> usuAdm;
    
    private Usuario usuario;
    private List retornoUsuarios;
    private List retornoProfessores;
    
    public UnidadeController(){
        unidade = new Unidade();                   
        
    }
    
    public DataModel getLista(){
        if(lista == null || lista.getRowCount() == 0){
            lista = new ListDataModel(unidadeDao.listar(getUnidade()));
        }
        return lista;
    }
    
    public void preparaInclusao(){
        
        FacesMessage msg = null;
        FacesContext context = FacesContext.getCurrentInstance();
        
        if(unidade.getNome().equals("")){
                        
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O nome da unidade deve ser informado", "");
            context.getCurrentInstance().addMessage(null, msg);
        }else{
            
            if(!acao.equals("edicao")){
            
                    UnidadeDao consulta = new UnidadeDao();
                    resultado = consulta.consultaUnidade(unidade.getNome());

                    if(resultado == 0){
                        salvaOperacao();
                        resetUnidade();
                    }else{
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Já existe uma unidade com esse nome", "");
                        context.getCurrentInstance().addMessage(null, msg);
                    }
            
            }else{
                
                editaUnidade();
                acao = "";
            }
            
        }        
        
    }
    
    public void salvaOperacao(){
        
        FacesMessage msg = null;
        FacesContext context = FacesContext.getCurrentInstance();   
        
        this.unidade.setDt_cadastro(data);
        
        LoginController usuarioLogado = new LoginController();
        
        this.unidade.setCd_usuario_cadastro(usuarioLogado.Usuario.getId());
        
        retorno = unidadeDao.salvar(this.unidade);
        
        lista = new ListDataModel(unidadeDao.listar(unidade));
        
        if(retorno){
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unidade cadastrada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);         
            
        usuAdm = usuarioDao.consultaAdm();
            
        for (int i = 0; i < this.usuAdm.size(); i++){                                     
            
            System.out.println("Usuario :"+this.usuAdm.get(i).getNome());
            
            this.usuario = this.usuAdm.get(i);
            
            Set<Unidade> unidades = new HashSet<Unidade>();
            
            List<Integer> integerArray = new ArrayList<Integer>();
            
            for (Iterator iterator = usuarioLogado.Usuario.getUnidades().iterator(); iterator.hasNext();){
            
                Unidade unidade = (Unidade) iterator.next();                     

                unidades.add(unidade);
                
                integerArray.add(unidade.getId());
        
            }     

            unidades.add(this.unidade);
            
            this.usuario.setUnidades(unidades);
            
            unidadeDao.atualizar(this.usuario);
            
        }            
            
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Falha ao salvar unidade!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        }
        
    }
    
    public void editaUnidade(){
        
        FacesMessage msg = null;
        
        unidade.setDt_atualizacao(data);
        
        LoginController usuarioLogado = new LoginController();
        
        unidade.setCd_usuario_atualizacao(usuarioLogado.Usuario.getId());
        
        retorno = unidadeDao.atualizar(unidade);       
        resetUnidade();
        
        lista = new ListDataModel(unidadeDao.listar(unidade));
        
        if(retorno){           
           
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unidade atualizada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            
        }          
        
    }
    
    public void resetUnidade(){
        unidade = new Unidade();
    }
    
    public void deleteUnidade(){
        
        FacesMessage msg = null;
        
        retornoUsuarios    = consulta.listaUsuarioUnidade(this.unidadeSelecionada);               
        
        if(this.unidadeSelecionada == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione a unidade a ser deletada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);    
            
        }else if(!retornoUsuarios.isEmpty()){

            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Existem Usuários relacionados a Unidade!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg); 
            
        }else{                        
        
            retorno = unidadeDao.excluir(this.unidadeSelecionada);
            
            if(retorno){
            
                resetUnidade();
                lista = new ListDataModel(unidadeDao.listar(getUnidade()));
                
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unidade excluída corretamente!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);                             
            
            }else{
                
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao deletar unidade!", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);                             
                
            }
            
        }
        
    }
    
    public Unidade preparaEdicao(){
        
        FacesMessage msg = null;
        
        if(this.unidadeSelecionada == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione a unidade a ser editada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
            
        }else{
        
            unidade = this.unidadeSelecionada;
            acao = "edicao";
        
        }
        
      return unidade;
    }

    public Unidade getUnidade() {
        return unidade;
    }

    public void setUnidade(Unidade unidade) {
        this.unidade = unidade;
    }

    public Unidade getUnidadeSelecionada() {
        return unidadeSelecionada;
    }

    public void setUnidadeSelecionada(Unidade unidadeSelecionada) {
        this.unidadeSelecionada = unidadeSelecionada;
    }
            
}